/*
 * @Description: 抽象类
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-04-30 18:58:45
 * @LastEditTime: 2021-05-06 09:37:47
 */
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
/**
 * 抽象类是使用`abstract`关键字定义的类
 * 抽象类是为派生类（子类）服务的
 * 抽象方法只能出现在抽象类中
 * 抽象方法必须在子类中实现，否则编译错误
 * 属性也可以抽象，但一般不这么写
 * 抽象类中的抽象方法只有申明没有实现
 * 抽象类中的实例方法会被继承到子类中
 * 抽象类是不能够被实例化的，只有其子类可以实例化
 * `abstract`不能修饰构造方法
 */
(function () {
    // class Animal{
    //     abstract name:string //报错：抽象方法只能出现在抽象类中
    // }
    var Animal = /** @class */ (function () {
        function Animal(name) {
            this.name = name;
        }
        Animal.prototype.sayHi = function () {
            console.log("hello");
        };
        return Animal;
    }());
    var Dog = /** @class */ (function (_super) {
        __extends(Dog, _super);
        function Dog() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        Dog.prototype.run = function () {
            console.log("".concat(this.name, "\u5728\u81EA\u7531\u7684\u5954\u8DD1"));
        };
        return Dog;
    }(Animal));
    // let animal = new Animal() //报错：无法创建抽象类的实例
    var dog = new Dog("小狗花花");
    dog.run(); // 小狗花花在自由的奔跑
    dog.sayHi(); // hello
})();
